From 353e3c0d57816a07282e008a1c3dcc1737f8d33f Mon Sep 17 00:00:00 2001 From: Keir Fraser Date: Mon, 2 Mar 2009 10:32:32 +0000 Subject: [PATCH] x86: Small fix for gpf when writing 1s to MCi_STATUS MSRs. According to spec, only 0s is allowed to be written. This error is found when do cpu-offline, cmci happens. For avoiding missing future cmci after changing cmci owner, we need to process pending cmci errors to clear MCi_STATUS MSRs. Signed-off-by: Ke Liping Signed-off-by: Jiang Yunhong --- xen/arch/x86/cpu/mcheck/mce_intel.c | 19 +++++++++++++------ xen/arch/x86/cpu/mcheck/x86_mca.h | 2 -- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/xen/arch/x86/cpu/mcheck/mce_intel.c b/xen/arch/x86/cpu/mcheck/mce_intel.c index 7a6cf8facd..dabac9ac5c 100644 --- a/xen/arch/x86/cpu/mcheck/mce_intel.c +++ b/xen/arch/x86/cpu/mcheck/mce_intel.c @@ -359,12 +359,6 @@ static int do_cmci_discover(int i) return 0; } set_bit(i, __get_cpu_var(mce_banks_owned)); - /* Clear Corected Error Counter field, make sure CMCI could - * be triggered on the new owner - */ - msr = MSR_IA32_MC0_STATUS + 4 * i; - rdmsrl(msr, val); - wrmsrl(msr, val & ~MCi_STATUS_ERRCOUNT); out: clear_bit(i, __get_cpu_var(no_cmci_banks)); return 1; @@ -374,6 +368,7 @@ static void cmci_discover(void) { unsigned long flags; int i; + struct mc_info *mi = NULL; printk(KERN_DEBUG "CMCI: find owner on CPU%d\n", smp_processor_id()); @@ -385,6 +380,18 @@ static void cmci_discover(void) spin_unlock_irqrestore(&cmci_discover_lock, flags); + /* In case CMCI happended when do owner change. + * If CMCI happened yet not processed immediately, + * MCi_status (error_count bit 38~52) is not cleared, + * the CMCI interrupt will never be triggered again. + */ + mi = machine_check_poll(MC_FLAG_CMCI); + if (mi) { + x86_mcinfo_dump(mi); + if (dom0 && guest_enabled_event(dom0->vcpu[0], VIRQ_MCA)) + send_guest_global_virq(dom0, VIRQ_MCA); + } + printk(KERN_DEBUG "CMCI: CPU%d owner_map[%lx], no_cmci_map[%lx]\n", smp_processor_id(), *((unsigned long *)__get_cpu_var(mce_banks_owned)), diff --git a/xen/arch/x86/cpu/mcheck/x86_mca.h b/xen/arch/x86/cpu/mcheck/x86_mca.h index c0ad6ce761..df3899bbfe 100644 --- a/xen/arch/x86/cpu/mcheck/x86_mca.h +++ b/xen/arch/x86/cpu/mcheck/x86_mca.h @@ -46,8 +46,6 @@ #define MCi_STATUS_MSEC 0x00000000ffff0000ULL /* Other information */ #define MCi_STATUS_OTHER 0x01ffffff00000000ULL -/*Corrected Error Count*/ -#define MCi_STATUS_ERRCOUNT 0x001FFFC0000000000ULL /* processor context corrupt */ #define MCi_STATUS_PCC 0x0200000000000000ULL /* MSR_K8_MCi_ADDR register valid */ -- 2.30.2